#ifndef __PYCP_OBJECTS_HEADER_FILE
#define __PYCP_OBJECTS_HEADER_FILE

class BasePycpObject;
class PycpStringObject;
class PycpIntegerObject;
class PycpDecimalObject;
class PycpTypeObject;
class PycpFileObject;

class BasePycpObject{
	private: 
		unsigned long long int linked;

		// Abstract class is not allowed to be constructed.
		BasePycpObject(void);
		BasePycpObject(BasePycpObject* other); // copy
		~BasePycpObject(void);

	public:

		// Magic methods like Python's.
		PycpIntegerObject* __int__(void);
		PycpDecimalObject* __decimal__(void);
		PycpStringObject* __string__(void);
		PycpTypeObject* __type__(void);
		PycpDecimalObject* __size__(void);

		// Destroy the object.
		void link(void);
		void unlink(void);
};

class PycpStringObject : public BasePycpObject{
	private:
		wchar_t* string_array;

	public:
		PycpStringObject(void);
		PycpStringObject(const char* lcstring);
		PycpStringObject(const wchar_t* cstring);
		PycpStringObject(PycpStringObject* other);
		~PycpStringObject(void);

		wchar_t* __cstr__(void);
};

#endif